#include "yaml_file.h"

// 文件操作
namespace file_manager{

    /***********************************************************
     * Ymal文件读写
     ***********************************************************/
    // 处理带双引号的字符串读取异常导致写入也异常问题
    // * data_en: " "  -> data_en: !<!> " "  -> data_en: " "
    void ReplaceString(YAML::Node& node){
        if (node.IsScalar()) { // 如果节点是标量
            node = YAML::Node(node.as<std::string>()); // 将字符串替换为空值
        } else if (node.IsSequence()) { // 如果节点是序列
            for (std::size_t i = 0; i < node.size(); ++i) {
                YAML::Node nn = node[i];
                ReplaceString(nn); // 递归处理序列中的每个元素
            }
        } else if (node.IsMap()) { // 如果节点是映射
            for (auto it = node.begin(); it != node.end(); ++it) {
                // std::cerr << "key: " << it->first << std::endl;
                ReplaceString(it->second); // 递归处理映射中的每个值
            }
        }
    }

    // Ymal文件写入
    bool WriteYamlFile(string file_path, YAML::Node& config){
        if(!config.IsNull())
            ReplaceString(config);
        ofstream fout(file_path);
        fout << config;
        fout.close(); 
        return true; 
    }

    // Ymal文件读取
    YAML::Node ReadYamlFile(string file_path){
        YAML::Node config;
        try{
            config = YAML::LoadFile(file_path);
            if(!config.IsNull())
                ReplaceString(config);
        }catch(YAML::BadFile &e) {
            std::cerr << "read error, file_path:" << file_path.c_str() << std::endl;
        }
        return config;    
    }
};